package com.java.reflection;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import org.junit.jupiter.api.Test;

import com.java.test.C;

public class StudentTest {
	/**
	 * 测试类
	 */
	@Test
	public void test01() {
		/**
		 * 类名的获取方法
		 */
		// （1）Class.forName（）

		try {
			Class c = Class.forName("com.java.reflection.Student");
			System.out.println(c);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// (2)类名.class
		Class c1 = Student.class;
		// (3)对象名.getClass
		Student stu0 = new Student();
		Class c2 = stu0.getClass();

		System.out.println(c1);
		System.out.println(c2);
	}

	/**
	 * 通过一个反射机构来获取Student中的所有成员变量
	 */
	@Test
	public void test02() {
		// 获取class
		Student stu1 = new Student();
		Class c3 = stu1.getClass();
		// 利用File来获取公共属性放在数组中

		Field[] files = c3.getFields();
		System.out.println("size=" + files.length);
		for (Field field : files) {
			System.out.println(field.getName());
		}
		// 利用File来获取所有的属性放在数组中
		Field[] files1 = c3.getDeclaredFields();
		System.out.println("size=" + files1.length);
		for (Field field11 : files1) {
			System.out.println(Modifier.toString(field11.getModifiers()) + " " + field11.getType().getSimpleName() + " "
					+ field11.getName() + ";");
		}
	}

	@Test
	public void test03() {
		// 获取一个类的方法
		Student stu0 = new Student();
		// 在Student中必须提供toString方法，否则输出值会成为HashMap值
		System.out.println("输出反射之前的stu0的值：" + stu0);
		Class c = stu0.getClass();

		try {
			// 获取指定名字的属性对象
			Field f = c.getDeclaredField("stuName");
			Field f1 = c.getDeclaredField("stuSex");
			Field f2 = c.getDeclaredField("stuScore");
			// 设置可以操作私有属性的权限
			f.setAccessible(true);
			f1.setAccessible(true);
			f2.setAccessible(true);
			// 反射机制： 使用Field类中的set方法，改变边实例对象stu0的属性值
			f.set(stu0, "张三");
			f1.set(stu0, "男");
			f2.set(stu0, 89);
			System.out.println("输出反射之后的stu0的值：" + stu0);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	@Test
	public void test04() {
		try {
			Class c=Class.forName("java.lang.Object");
			System.out.println(c);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//获取Student的父类的方法
		Class c4=new Student().getClass().getSuperclass();
		//获取Student类的方法
		Class c5=new Student().getClass();
		System.out.println(c5);
		Class c2=Student.class;
		System.out.println(c2);
		
	}
}
